/* The file is saved in UTF-8 codepage.
 * Check: «Stereotype», Section mark-§, Copyright-©, Alpha-α, Beta-β, Smile-☺
 */
package cz.pecinovsky.english.lootp.ufo;
/*******************************************************************************
 *<pre>
 * Předchozí:   Není - toto_je_nově_definovaná_třída
 *              Ttt v projektu Ppp
 * Následující: Prozatím není
 *
 * Projekt  Ppp
 *   + Přidáno
 *   - Odebráno
 *   ~ Změněno
 *</pre>
 */

import cz.pecinovsky.english.lootp._000_.Run;


////////////////////////////////////////////////////////////////////////////////
//%%+  +++++ End of ignored starting test - place for imports +++++


/*******************************************************************************
 * Testovací třída UFOTest slouží ke komplexnímu otestování
 * třídy ...
 *
 * @author Rudolf PECINOVSKÝ
 * @version 6.03.2017 — 2010-11-08
 */
public class UFOTest extends junit.framework.TestCase
{
    ITovárnaNaUFO továrna;
    Dispečer      dispečer;
    IUFO          ufo;



//== CONSTANT CLASS ATTRIBUTES =================================================
//== VARIABLE CLASS ATTRIBUTES =================================================
//== CONSTANT INSTANCE ATTRIBUTES ==============================================
//== VARIABLE INSTANCE ATTRIBUTES ==============================================

//##############################################################################
//== KONSTRUKTORY A METODY VRACEJÍCÍ INSTANCE VLASTNÍ TŘÍDY ====================

    /***************************************************************************
     * Vytvoří test se zadaným názvem.
     *
     * @param name  Název konstruovaného testu
     */
    public UFOTest(String name)
    {
        super(name);
    }



//##############################################################################
//== PREPARATION AND CLEANING THE FIXTURE ======================================

    /***************************************************************************
     * Vytvoření přípravku (fixture), tj. sady objektů, s nimiž budou všechny
     * testy pracovat a která se proto vytvoří před spuštěním každého testu.
     */
    @Override
    protected void setUp()
    {
        továrna = new TovárnaNaUFO();
//        továrna = new TovárnaNaUFO_P();
    }


    /***************************************************************************
     * Úklid po testu - tato metoda se spustí po vykonání každého testu.
     */
    @Override
    protected void tearDown()
    {
    }


//== PRIVATE AND AUXILIARY CLASS METHODS =======================================
//== PRIVATE AND AUXILIARY INSTANCE METHODS ====================================
//== VNOŘENÉ A VNITŘNÍ TŘÍDY ===================================================
//== THE TESTS =================================================================

    /***************************************************************************
     * Testuje základní funkcionalitu vytvořeného UFO.
     * Při spuštění tohoto testu stačí, aby prošel.
     */
    public void testUFO()
    {
        final int    TV   = Dispečer.VELIKOST;
        final double DTAH = IUFO.DTAH;
        final int    f    = 4;  //frekvence

        double px=TV,  py=TV;   //Pozice
        double rx=0,   ry=0;    //rychlsot
        double tx=0,   ty=0;    //tah

        dispečer = Dispečer.getDispečer(továrna, 1, false);
        ufo = dispečer.přistavUFO();
        //----------------------------------------------------------------------
        assertEquals("Špatně nastavená vodorovná počáteční souřadnice",
                      px, ufo.getX(), .01);
        assertEquals("Špatně nastavená svislá počáteční souřadnice",
                      py, ufo.getY(), .01);
        assertEquals("Špatně nastavená počáteční vodorovná speed",
                      rx, ufo.getXSpeed(), .01);
        assertEquals("Špatně nastavená počáteční svislá speed",
                      ry, ufo.getYSpeed(), .01);
        assertEquals("Špatně nastavený počáteční vodorovný tah",
                      tx, ufo.getXTah(), .01);
        assertEquals("Špatně nastavený počáteční svislý tah",
                      ty, ufo.getXTah(), .01);
        //----------------------------------------------------------------------
        rx = 16;
        ry = 32;
        ufo.setSpeed(rx, ry);
        assertEquals("Metoda setSpeed špatně nastavuje vodorovnou speed",
                      rx, ufo.getXSpeed(), .01);
        assertEquals("Metoda setSpeed špatně nastavuje svislou speed",
                      ry, ufo.getYSpeed(), .01);
        ufo.popojeď(1);
        assertEquals("Metoda Popojeď špatně nastavuje vodorovnou souřadnici" +
                      " při nulovém tahu motorů a jednotkové frekvenci",
                      px+=rx, ufo.getX(), .01);
        assertEquals("Metoda Popojeď špatně nastavuje svislou souřadnici" +
                      " při nulovém tahu motorů a jednotkové frekvenci",
                      py+=ry, ufo.getY(), .01);
        //----------------------------------------------------------------------
        ufo.vlevo();
        assertEquals("Metoda vlevo špatně nastavuje vodorovný tah",
                      tx-=DTAH, ufo.getXTah(), .01);
        ufo.vlevo();
        assertEquals("Metoda vlevo špatně nastavuje vodorovný tah",
                      tx-=DTAH, ufo.getXTah(), .01);
        assertEquals("Metoda vlevo špatně nastavuje svislý tah",
                      ty, ufo.getYTah(), .01);
        //----------------------------------------------------------------------
        ufo.vzhůru();
        assertEquals("Metoda vzhůru špatně nastavuje svislý tah",
                      ty-=DTAH, ufo.getYTah(), .01);
        ufo.vzhůru();
        assertEquals("Metoda vzhůru špatně nastavuje svislý tah",
                      ty-=DTAH, ufo.getYTah(), .01);
        assertEquals("Metoda vzhůru špatně nastavuje vodorovný tah",
                      tx, ufo.getXTah(), .01);
        //----------------------------------------------------------------------
        ufo.vypniMotory();
        assertEquals("Metoda vypniMotory nevypíná vodorovný tah",
                      tx=0, ufo.getXTah(), .01);
        assertEquals("Metoda vypniMotory nevypíná svislý tah",
                      ty=0, ufo.getYTah(), .01);
        //----------------------------------------------------------------------
        ufo.vpravo();
        assertEquals("Metoda vpravo špatně nastavuje vodorovný tah",
                      tx+=DTAH, ufo.getXTah(), .01);
        ufo.vpravo();
        assertEquals("Metoda vpravo špatně nastavuje vodorovný tah",
                      tx+=DTAH, ufo.getXTah(), .01);
        ufo.vpravo();
        assertEquals("Metoda vpravo špatně nastavuje vodorovný tah",
                      tx+=DTAH, ufo.getXTah(), .01);
        assertEquals("Metoda vpravo špatně nastavuje svislý tah",
                      ty, ufo.getYTah(), .01);
        //----------------------------------------------------------------------
        ufo.dolů();
        assertEquals("Metoda dolů špatně nastavuje svislý tah",
                      ty+=DTAH, ufo.getYTah(), .01);
        ufo.dolů();
        assertEquals("Metoda dolů špatně nastavuje svislý tah",
                      ty+=DTAH, ufo.getYTah(), .01);
        assertEquals("Metoda dolů špatně nastavuje vodorovný tah",
                      tx, ufo.getXTah(), .01);
        //----------------------------------------------------------------------
        ufo.popojeď(1);
        assertEquals("Metoda popojeď ovlivňuje vodorovný tah",
                      tx, ufo.getXTah(), .01);
        assertEquals("Metoda popojeď ovlivňuje svislý tah",
                      ty, ufo.getYTah(), .01);
        assertEquals("Metoda Popojeď špatně nastavuje vodorovnou speed" +
                      " při NEnulovém tahu motorů a jednotkové frekvenci",
                      rx+=tx, ufo.getXSpeed(), .01);
        assertEquals("Metoda Popojeď špatně nastavuje svislou speed" +
                      " při NEnulovém tahu motorů a jednotkové frekvenci",
                      ry+=ty, ufo.getYSpeed(), .01);
        assertEquals("Metoda Popojeď špatně nastavuje vodorovnou souřadnici" +
                      " při NEnulovém tahu motorů a jednotkové frekvenci",
                      px+=rx, ufo.getX(), .01);
        assertEquals("Metoda Popojeď špatně nastavuje svislou souřadnici" +
                      " při NEnulovém tahu motorů a jednotkové frekvenci",
                      py+=ry, ufo.getY(), .01);
        //----------------------------------------------------------------------
        ufo.popojeď(f);
        assertEquals("Metoda Popojeď špatně nastavuje vodorovnou speed" +
                      " při NEnulovém tahu motorů a NEjednotkové frekvenci",
                      rx+=tx/f, ufo.getXSpeed(), .01);
        assertEquals("Metoda Popojeď špatně nastavuje svislou speed" +
                      " při NEnulovém tahu motorů a NEjednotkové frekvenci",
                      ry+=ty/f, ufo.getYSpeed(), .01);
        assertEquals("Metoda Popojeď špatně nastavuje vodorovnou souřadnici" +
                      " při NEnulovém tahu motorů a NEjednotkové frekvenci",
                      px+=rx/f, ufo.getX(), .01);
        assertEquals("Metoda Popojeď špatně nastavuje svislou souřadnici" +
                      " při NEnulovém tahu motorů a NEjednotkové frekvenci",
                      py+=ry/f, ufo.getY(), .01);
    }



    /***************************************************************************
     * Testuje správné nastavení rychlosti UFO.
     */
    public void testSpeed()
    {
        Dispečer disp = Dispečer.getDispečer(továrna);
        IUFO u1 = disp.přistavUFO();
             u1.setSpeed(10,10);
        IUFO u2 = disp.přistavUFO();
             u2.setSpeed(8,12);
        IUFO u3 = disp.přistavUFO();
             u3.setSpeed(6,12);
        IUFO u4 = disp.přistavUFO();
             u4.setSpeed(4,15);
        IUFO u5 = disp.přistavUFO();
             u5.setSpeed(0,20);
    }


    /***************************************************************************
     * Vytvoří standardnío dispečera a spustí tak hru.
     */
    public void testHra()
    {
        Dispečer.getDispečer(továrna);
    }

//%I+
//}
//%I-
//%%- ---- Start of the ovejumped text with closing of the envelope ----
////////////////////////////////////////////////////////////////////////////////
//== TESTING CLASSES AND METHODS ===============================================
//%X+   Metoda připravená k vložení do testovacích tříd
     /** */
     public void testFixture() {}
//%X-


    /***************************************************************************
     * Třída, jejíž instance má na starosti úklid mezi jednotlivými testy,
     * který není možno zakomponovat do metody {@code tearDown()},
     * dokud nebudou studenti umět programovat.
     */
    private static class TearDown implements Run.ITD
    {
        /** {@inheritDoc} */
        @Override
        public void cleanUp()
        {
        }
    }


    /***************************************************************************
     * Test method.
     */
    public static void test()
    {
        Run.tests(UFOTest.class,
                new TearDown(),
//                "testFixture",
                "testUFO",
                "testSpeed",
                "testHra",
                "");
        System.exit(0);
    }
    /** @param args Parametry příkazového řádku - nepoužívané. */
    public static void main(String[] args)  {  test();  }
}
